package com.sjy.jnidemo2

import android.app.job.JobInfo
import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import com.sjy.jnidemo2.cppcalljava.CppCallJavaUtil
import com.sjy.jnidemo2.jnidefault.MyDefaultJni
import kotlinx.android.synthetic.main.activity_main.*


/**
 * 演示各个调用
 */
class MainAct : AppCompatActivity() {
    companion object {
        const val TAG = "SJY"
    }

    var util: CppCallJavaUtil? = null;
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        //
        javaCallCpp()
        //
        cppCallJava()


    }

    /**
     * <1> as默认生成的调用方式：java调用c
     * cpp代码是native-lib.cpp
     */
    fun javaCallCpp() {
        jni_default.text = MyDefaultJni().stringFromJNI()
    }


    /**
     * <2> c调用java的几种方式
     *
     * cpp代码是CppCallJava.cpp
     */
    fun cppCallJava() {

        //初始化 java端代码
        util = CppCallJavaUtil()

        //<2-1> 非静态native方法调用非静态方法
        util!!.cppCallJavaMethod()

        //<2-2> 基本类型的返回值
        util!!.cppCallJavaFunReturnInt()
        Log.d(TAG, "打印结果${util!!.cppCallJavaFunReturnInt()}")

        //<2-3> 返回类1
        var myutil = util!!.nativeCppCallJavaMethodReturnClass()
        Log.d(TAG, "初始化类，java端调用变量值："+myutil.myAge)

        //<2-3> 返回类1
        var myPerson = util!!.nativeCppCallJavaMethodReturnClass2()
        Log.d(TAG, myPerson.str)


        //<2-4> 非静态native方法调用本对象中的静态方法
        util!!.nativeCppCallJavaStaticMethod()

        //<2-5> 非静态native方法调其他对象内的方法 使用NewObject构造
        util!!.nativeCppCallJavaMethodOutside()

        //<2-6> 非静态native方法调非本对象内的方法 使用AllocObject构造（区别就是没有初始化）
        util!!.nativeCppCallJavaMethodOutside2()

        //<2-7> 静态native方法调本对象内的方法：
        //关键点：native的封装参数jobject变成jclass+AllocObject初始化jclass参数
        CppCallJavaUtil.staticCppCallJavaMethod()

        //<2-8> 访问java的全局变量（普通变量和静态变量）
        util!!.cppCallJavaField()


    }


}